[UE]Networking源码浅析
Networking源码浅析
定义
Bunch:表示一组相关的网络数据,包含 RPC / 属性同步 等信息,UE 中 DS/Client 通信的基本单位。
Packet:UDP 的基本传输单位,可以打包一个或多个 Bunch,在接受端进行解析。
NetDriver:管理网络通信,比如管理连接、处理数据包的发送和接收、处理网络事件。
NetConnection:表示一个网络连接,与一个 NetDriver 关联,并通过 NetDriver 进行实际的网络通信。
Channel:管理网络传输,进行数据分类,提供 SendBunch、ReceivedRawBunch 方法,由 NetConnection 管理,一个 NetConnection 可以包含多种 Channel。
FObjectReplicator:处理对象的网络同步,保存属性快照,进行状态改变发送、更新同步状态、接受与发送消息。
ActorChannel:关联特定的 Actor 负责其同步,包含多个 FObjectReplicator 用于复制其 Actor、ActorComponent 。
FRepLayout:管理复制的属性,定义底层数据内存布局,数据比较、序列化与反序列化等。
RPC
Server RPC
| Calling Machine | Owning Connection | Executing Machine |
|---|---|---|
| Server | Client | Server |
| Server | Server | Server |
| Server | None | Server |
| Client | Invoking Client | Server |
| Client | Different Client | Dropped |
| Client | Server | Dropped |
| Client | None | Dropped |
Client RPC
| Calling Machine | Owning Connection | Executing Machine |
|---|---|---|
| Server | Owning Client | Owning Client |
| Server | Server | Server |
| Server | None | Server |
| Client | Invoking Client | Invoking Client |
| Client | Different Client | Invoking Client |
| Client | Server | Invoking Client |
| Client | None | Invoking Client |
NetMulticast RPC
| Calling Machine | Owning Connection | Executing Machine |
|---|---|---|
| Server | Client | Server and all Clients the invoking actor is relevant for |
| Server | Server | Server and all Clients the invoking actor is relevant for |
| Server | None | Server and all Clients the invoking actor is relevant for |
| Client | Invoking Client | Invoking Client |
| Client | Different Client | Invoking Client |
| Client | Server | Invoking Client |
| Client | None | Invoking Client |
Send RPC
flowchart TB UObject::ProcessEvent -- FunctionCallspace::Remote --> AActor::CallRemoteFunction --> UNetDriver::ProcessRemoteFunction ServerMulticast(bIsServerMulticast) UNetDriver::ProcessRemoteFunction --> ServerMulticast ServerMulticast --TRUE-->UNetDriver::GetFunctionRepLayout --Actor IsNetRelevant || FUNC_NetReliable --> FRepLayout::BuildSharedSerializationForRPC --> UNetDriver::InternalProcessRemoteFunctionPrivate --> UNetDriver::ProcessRemoteFunctionForChannelPrivate ServerMulticast --FALSE--> UReplicationGraph::ProcessRemoteFunction --> UNetDriver::ProcessRemoteFunctionForChannel --> UNetDriver::ProcessRemoteFunctionForChannelPrivate -- FRepLayout::SendPropertiesForRPC --> QueueBunch QueueBunch(!bReliable & NetMulticast) QueueBunch--TRUE-->UChannel::SendBunch QueueBunch--FALSE-->UActorChannel::QueueRemoteFunctionBunch
Receive RPC
flowchart TB UIpNetDriver::TickDispatch --> UNetConnection::ReceivedRawPacket --> UNetConnection::ReceivedPacket --> UNetConnection::DispatchPacket --> UChannel::ReceivedRawBunch --> UChannel::ReceivedNextBunch --> UChannel::ReceivedSequencedBunch --> UActorChannel::ReceivedBunch --> UActorChannel::ProcessBunch --> FObjectReplicator::ReceivedBunch -- FObjectReplicator::ReceivedRPC --> UObject::ProcessEvent
属性同步
Replicate Diff
flowchart TB UNetDriver::TickFlush --> UNetDriver::ServerReplicateActors --> UActorChannel::ReplicateActor --> FObjectReplicator::ReplicateProperties --> FNetSerializeCB::UpdateChangelistMgr --> FRepLayout::UpdateChangelistMgr --> FRepLayout::CompareProperties
Replicate Send
flowchart TB UNetDriver::TickFlush --> UNetDriver::ServerReplicateActors --> UActorChannel::ReplicateActor --> FObjectReplicator::ReplicateProperties --> FRepLayout::ReplicateProiperties --> FRepLayout::SendProperties --> FProperty::NetSerializeItem --> UChannel::SendBunch
Replicate Receive
flowchart TB UIpNetDriver::TickDispatch --> UNetConnection::ReceivedRawPacket --> UNetConnection::ReceivedPacket --> UNetConnection::DispatchPacket --> UChannel::ReceivedRawBunch --> UChannel::ReceivedNextBunch --> UChannel::ReceivedSequencedBunch --> UActorChannel::ReceivedBunch --> UActorChannel::ProcessBunch --> FObjectReplicator::ReceivedBunch --> FRepLayout::ReceiveProperties --> FRepLayout::ReceivePropertyHelper --> FProperty::NetSerializeItem --> FObjectReplicator::PostReceivedBunch --> FObjectReplicator::CallRepNotifies
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.



